Spring 2025 • BAA1030 Data Analytics & Storytelling (20074) Student: Isha Tanwar (ID 48614) Programme: MSc in Management (Strategy)
Note
Acknowledgement
Thanks to Prof. Dr. Damien Dupré for his unwavering guidance and support.
Introduction
This report leverages UNICEF and World Bank data (2010–2024) to construct a Composite Vulnerability Index (CVI) that synthesizes economic (GDP per capita), health (DTP vaccination coverage and life expectancy), and social (orphanhood rates) indicators. By analyzing these dimensions through fully interactive visualizations, the report aims to uncover hidden disparities, track global trends, and identify actionable policy levers. The analysis directly supports Sustainable Development Goals (SDGs) 3 (Good Health and Well-being) and 10 (Reduced Inequalities). Why it matters: Despite global progress, significant health and socio-economic gaps persist across countries. Understanding vulnerability at the intersection of economic, health, and social factors is critical for designing effective, targeted interventions to protect the most at-risk populations.
Code
import pandas as pdimport plotly.express as pxfrom sklearn.preprocessing import MinMaxScalerfrom sklearn.linear_model import LinearRegression# 1) Load & preprocess datadf = pd.read_csv("merged_final.csv")df["OrphanRate_per_1000"] = ( df["OrphanCount"] / df["Population, total"]) *1000df = df.rename(columns={"GDP per capita (constant 2015 US$)": "GDP","Life expectancy at birth, total (years)": "LifeExpectancy"})# 2) Set year parameter (Quarto injects params; Jupyter fallback)try: year = params.yearexceptNameError: year =2022# ← use any test year here when running interactively
Executive Summary
Key Findings:
Economic Growth and Vaccination: A $1,000 increase in GDP per capita correlates with a 0.22 percentage point rise in DTP vaccination coverage (R² ≈ 0.08), indicating a modest positive link between economic development and healthcare access.
Regional Disparities: DTP coverage rates remain critically low (< 60%) across Sub-Saharan Africa and South Asia, underscoring regional vulnerabilities.
Highest Vulnerability (2022): The countries with the highest Composite Vulnerability Index (CVI) scores are Somalia (72.5), Angola (67.7), and Nigeria (67.6), reflecting compounded economic, health, and social challenges.
Challenges:
Orphanhood Burden: High orphan populations in countries like Nigeria (13.9 million), DR Congo (5.8 million), Pakistan (5.8 million), Indonesia (5.7 million), and Ethiopia (3.0 million) exacerbate social vulnerability and strain on public health systems.
Limited Health Gains: Economic gains alone are insufficient to drive significant improvements in DTP coverage, suggesting the need for targeted health interventions alongside economic growth.
Opportunities:
Policy Simulations suggest that a 12% increase in GDP could lead to a 4–8 percentage point rise in DTP coverage among vulnerable nations, offering a path to meaningful health outcomes if economic development efforts are coupled with health system strengthening.
1. GDP vs DTP Coverage
Code
fig1 = px.scatter( df.query("Year==@year").dropna(subset=["GDP", "DTP"]), x="GDP", y="DTP", size="Population, total", color="Country", hover_name="Country", log_x=True, size_max=60, title=f"GDP per Capita vs DTP Coverage ({year})", labels={"GDP": "GDP per Capita (USD)","DTP": "DTP Coverage (%)" })fig1.update_layout( autosize=True, width=None, height=None, hovermode="closest", # Better touch interactions on mobile showlegend=False# << LEGEND IS NOW REMOVED)fig1.show()
Insight: Wealth explains about 8 % of the variation in DTP coverage—economics matter but other factors are also critical.
Insight: Highest CVI countries (Somalia, Angola, Nigeria) need integrated economic, health, and protection programs.
7. Policy Simulator: + 12 % GDP → DTP
Code
from sklearn.linear_model import LinearRegression# 1) Train on GDP → DTP up to selected yeartrain = df.query("Year <= @year").dropna(subset=["GDP", "DTP"])model = LinearRegression().fit(train[["GDP"]], train["DTP"])# 2) Take your top-CVI DataFrame `c` (from chunk viz6-cvi)sim = c.copy()sim["GDP2"] = sim["GDP"] *1.12# 3) Prepare X for prediction: must have column name "GDP"X_pred = sim[["GDP2"]].rename(columns={"GDP2": "GDP"})sim["DTP2"] = model.predict(X_pred)# 4) Melt for plottingsim_melt = sim.melt( id_vars="Country", value_vars=["DTP", "DTP2"], var_name="Scenario", value_name="Coverage")# 5) Plot interactive barimport plotly.express as pxfig7 = px.bar( sim_melt, x="Coverage", y="Country", color="Scenario", orientation="h", title=f"Simulated DTP Coverage with +12% GDP ({year})", labels={"Coverage": "DTP Coverage (%)", "Scenario": "Scenario"})fig7.update_layout( autosize=True, width=None, height=None, hovermode="closest", yaxis=dict( categoryorder="total ascending" ), legend=dict( orientation="h", yanchor="bottom", y=-0.3, xanchor="center", x=0.5 ), margin=dict(t=50, l=30, r=30, b=30))fig7.show()
Insight: A modest GDP increase could boost immunisation by 4–8 percentage points in the most vulnerable countries—powerful evidence for targeted economic support.
SDG Alignment & Recommendations
SDG 3: Good Health & Wellbeing
Invest in mobile clinics & outreach.
SDG 10: Reduced Inequalities
Direct fiscal transfers to high-CVI nations.
Note
Next Steps Checklist
References
UNICEF (2024) Child Vulnerability Indicators.
World Bank (2024) World Development Indicators.
United Nations (2023) Sustainable Development Goals.
Source Code
---title: "UNICEF: Global Child Vulnerability & DTP Vaccination"format: html: embed-resources: true toc: true toc-location: left toc-depth: 2 theme: cosmo backgroundcolor: "#f9f9f9" code-tools: true code-fold: truebibliography: references.bibcsl: harvard.cslparams: year: value: 2022 input: select options: [2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, 2023, 2024]execute: python: engine: .venv/bin/python echo: false warning: false message: false error: truecss: styles.css---<div style="text-align: center;">**Spring 2025 • BAA1030 Data Analytics & Storytelling (20074)** **Student**: Isha Tanwar (ID 48614) **Programme**: MSc in Management (Strategy)</div>::: callout-note**Acknowledgement** Thanks to Prof. Dr. Damien Dupré for his unwavering guidance and support.:::# IntroductionThis report leverages UNICEF and World Bank data (2010–2024) to construct a ***Composite Vulnerability Index (CVI)*** that synthesizes economic (GDP per capita), health (DTP vaccination coverage and life expectancy), and social (orphanhood rates) indicators.By analyzing these dimensions through fully interactive visualizations, the report aims to uncover hidden disparities, track global trends, and identify actionable policy levers. The analysis directly supports Sustainable Development Goals (SDGs) 3 (Good Health and Well-being) and 10 (Reduced Inequalities).Why it matters:Despite global progress, significant health and socio-economic gaps persist across countries. Understanding vulnerability at the intersection of economic, health, and social factors is critical for designing effective, targeted interventions to protect the most at-risk populations.```{python}#| label: setupimport pandas as pdimport plotly.express as pxfrom sklearn.preprocessing import MinMaxScalerfrom sklearn.linear_model import LinearRegression# 1) Load & preprocess datadf = pd.read_csv("merged_final.csv")df["OrphanRate_per_1000"] = ( df["OrphanCount"] / df["Population, total"]) *1000df = df.rename(columns={"GDP per capita (constant 2015 US$)": "GDP","Life expectancy at birth, total (years)": "LifeExpectancy"})# 2) Set year parameter (Quarto injects params; Jupyter fallback)try: year = params.yearexceptNameError: year =2022# ← use any test year here when running interactively```::: callout-tip# Executive Summary## Key Findings:+ Economic Growth and Vaccination: A $1,000 increase in GDP per capita correlates with a 0.22 percentage point rise in DTP vaccination coverage (R² ≈ 0.08), indicating a modest positive link between economic development and healthcare access.+ Regional Disparities: DTP coverage rates remain critically low (< 60%) across Sub-Saharan Africa and South Asia, underscoring regional vulnerabilities.+ Highest Vulnerability (2022): The countries with the highest Composite Vulnerability Index (CVI) scores are Somalia (72.5), Angola (67.7), and Nigeria (67.6), reflecting compounded economic, health, and social challenges.## Challenges:+ Orphanhood Burden: High orphan populations in countries like Nigeria (13.9 million), DR Congo (5.8 million), Pakistan (5.8 million), Indonesia (5.7 million), and Ethiopia (3.0 million) exacerbate social vulnerability and strain on public health systems.+ Limited Health Gains: Economic gains alone are insufficient to drive significant improvements in DTP coverage, suggesting the need for targeted health interventions alongside economic growth.## Opportunities:+ Policy Simulations suggest that a 12% increase in GDP could lead to a 4–8 percentage point rise in DTP coverage among vulnerable nations, offering a path to meaningful health outcomes if economic development efforts are coupled with health system strengthening.:::# 1. GDP vs DTP Coverage```{python}#| label: viz1-scatterfig1 = px.scatter( df.query("Year==@year").dropna(subset=["GDP", "DTP"]), x="GDP", y="DTP", size="Population, total", color="Country", hover_name="Country", log_x=True, size_max=60, title=f"GDP per Capita vs DTP Coverage ({year})", labels={"GDP": "GDP per Capita (USD)","DTP": "DTP Coverage (%)" })fig1.update_layout( autosize=True, width=None, height=None, hovermode="closest", # Better touch interactions on mobile showlegend=False# << LEGEND IS NOW REMOVED)fig1.show()```### Insight: Wealth explains about 8 % of the variation in DTP coverage—economics matter but other factors are also critical.# 2. Top 10 Orphanhood Burden```{python}#| label: viz2-bartop10 = df.query("Year==@year").nlargest(10, "OrphanCount").assign( Orphans_M=lambda d: d["OrphanCount"] /1e6)fig2 = px.bar( top10, x="Orphans_M", y="Country", orientation="h", hover_data={"Orphans_M": ":.1f"}, labels={"Orphans_M": "Orphans (Millions)"}, title=f"Top 10 Countries by Orphanhood ({year})")fig2.update_layout( autosize=True, width=None, height=None, hovermode="closest", yaxis=dict( categoryorder="total ascending" ), legend=dict( orientation="h", yanchor="bottom", y=-0.3, xanchor="center", x=0.5 ))fig2.show()```### Insight: Five countries (Nigeria, DR Congo, Pakistan, Indonesia, Ethiopia) account for over one-third of all orphans globally.# 3. Orphan Rate Trends (2010–year)```{python}#| label: viz3-linefocus = ["Yemen", "Somalia", "Guinea", "Ukraine", "Nigeria", "Ethiopia"]ts = df.query("Country in @focus and Year <= @year").dropna(subset=["OrphanRate_per_1000"])fig3 = px.line( ts, x="Year", y="OrphanRate_per_1000", color="Country", markers=True, title=f"Orphan Rate per 1,000 Children (2010–{year})", labels={"OrphanRate_per_1000": "Orphans per 1,000"})fig3.update_layout( autosize=True, width=None, height=None, hovermode="x unified", # Better timeline hover experience legend=dict( orientation="h", yanchor="bottom", y=-0.3, xanchor="center", x=0.5 ), legend_title_text="Country")fig3.show()```### Insight: Somalia reached ~61 orphans per 1 000 in 2012; Ukraine peaked at ~17 per 1 000 in 2021—highlighting crisis spikes.# 4. Faceted Orphanhood Trends```{python}#| label: viz4-facetfig4 = px.line( ts, x="Year", y="OrphanRate_per_1000", facet_col="Country", facet_col_wrap=3, title="Faceted Orphanhood Trends", labels={"OrphanRate_per_1000": "Orphans per 1,000"})fig4.update_traces(mode="lines+markers")fig4.update_layout( autosize=True, width=None, height=None, showlegend=False, hovermode="x unified", # Better hover experience across facets margin=dict(t=50, l=30, r=30, b=30) # Tighter margins for mobile)# Clean facet titles (remove "Country=")fig4.for_each_annotation(lambda a: a.update(text=a.text.split("=")[-1]))fig4.show()```### Insight: Facets let you compare individual country trajectories and spot divergent patterns at a glance.# 5. Animated Global DTP Coverage Map```{python}#| label: viz5-mapfig5 = px.choropleth( df.dropna(subset=["DTP"]), locations="Country", locationmode="country names", color="DTP", animation_frame="Year", range_color=[0, 100], color_continuous_scale="Viridis", title="Global DTP Coverage (2010–2024)")fig5.update_layout( autosize=True, width=None, height=None, hovermode="closest", # Best for touch on mobile geo=dict( projection_type="natural earth", showframe=False, showcoastlines=True, landcolor="lightgray", oceancolor="lightblue" ), margin=dict(t=50, l=30, r=30, b=30) # Tighter margins for mobile)fig5.show()```### Insight: The slider reveals how high-income regions sustain > 95 % coverage, while many low-income areas lag below 60 %.# 6. Composite Vulnerability Index (CVI)```{python}#| label: viz6-cvivalid = df.dropna(subset=["GDP", "DTP", "LifeExpectancy", "OrphanRate_per_1000"])valid = valid[valid["Year"] <= year]inv = pd.DataFrame({"DTP": 100- valid["DTP"],"GDP": valid["GDP"].max() - valid["GDP"],"LE": valid["LifeExpectancy"].max() - valid["LifeExpectancy"],"OR": valid["OrphanRate_per_1000"]})valid["CVI"] = MinMaxScaler((0, 100)).fit_transform(inv).mean(axis=1)c = valid.query("Year==@year").nlargest(10, "CVI")avg = valid.query("Year==@year")["CVI"].mean()fig6 = px.bar( c, x="CVI", y="Country", orientation="h", hover_data={"CVI": ":.1f"}, title=f"Child Vulnerability Index Top 10 ({year})", labels={"CVI": "CVI (0–100)"})fig6.add_vline( x=avg, line_dash="dash", annotation_text="Average", annotation_position="top right")fig6.update_layout( autosize=True, width=None, height=None, hovermode="closest", yaxis=dict( categoryorder="total ascending" ), margin=dict(t=50, l=30, r=30, b=30))fig6.show()```### Insight: Highest CVI countries (Somalia, Angola, Nigeria) need integrated economic, health, and protection programs.# 7. Policy Simulator: + 12 % GDP → DTP```{python}#| label: viz7-simfrom sklearn.linear_model import LinearRegression# 1) Train on GDP → DTP up to selected yeartrain = df.query("Year <= @year").dropna(subset=["GDP", "DTP"])model = LinearRegression().fit(train[["GDP"]], train["DTP"])# 2) Take your top-CVI DataFrame `c` (from chunk viz6-cvi)sim = c.copy()sim["GDP2"] = sim["GDP"] *1.12# 3) Prepare X for prediction: must have column name "GDP"X_pred = sim[["GDP2"]].rename(columns={"GDP2": "GDP"})sim["DTP2"] = model.predict(X_pred)# 4) Melt for plottingsim_melt = sim.melt( id_vars="Country", value_vars=["DTP", "DTP2"], var_name="Scenario", value_name="Coverage")# 5) Plot interactive barimport plotly.express as pxfig7 = px.bar( sim_melt, x="Coverage", y="Country", color="Scenario", orientation="h", title=f"Simulated DTP Coverage with +12% GDP ({year})", labels={"Coverage": "DTP Coverage (%)", "Scenario": "Scenario"})fig7.update_layout( autosize=True, width=None, height=None, hovermode="closest", yaxis=dict( categoryorder="total ascending" ), legend=dict( orientation="h", yanchor="bottom", y=-0.3, xanchor="center", x=0.5 ), margin=dict(t=50, l=30, r=30, b=30))fig7.show()```### Insight: A modest GDP increase could boost immunisation by 4–8 percentage points in the most vulnerable countries—powerful evidence for targeted economic support.# SDG Alignment & Recommendations## SDG 3: Good Health & Wellbeing Invest in mobile clinics & outreach.## SDG 10: Reduced Inequalities Direct fiscal transfers to high-CVI nations.::: callout-note**Next Steps Checklist**- [ ] Increase immunisation budgets by 10 % in top-CVI countries - [ ] Deploy community health workers in underserved regions - [ ] Implement real-time orphanhood monitoring systems:::# ReferencesUNICEF (2024) Child Vulnerability Indicators.World Bank (2024) World Development Indicators.United Nations (2023) Sustainable Development Goals.